package command

import (
	"codejy/globalfunc"
	"codejy/structdef"
	"codejy/utils"
	"flag"
	"os"
	"strings"
)

type LoadFileCmd struct {
	loadFiles []string //主文件路径
	priority  int      //优先级
}

func init() {
	RegisterCommand(&LoadFileCmd{
		priority: 1000,
	})
}

// 绑定
func (m *LoadFileCmd) Bind() {
	//装载文件load
	flag.Var(newSliceValue([]string{}, &m.loadFiles), "load", m.GetDesc())
}

// 满足条件才执行命令
func (m *LoadFileCmd) Condition() bool {
	return len(m.loadFiles) > 0
}

// 执行命令
func (m *LoadFileCmd) Execute(threadStore *structdef.ThreadStore) {
	//判断load是否为空,如果不为空,则遍历load,提前加载一些代码
	if len(m.loadFiles) > 0 {
		for i := range m.loadFiles {
			path := m.loadFiles[i]
			//判断是否是文件夹.
			isDir := IsDir(path)
			if isDir {
				var files []string
				utils.GetFiles(path, &files, false)
				for i2 := range files {
					globalfunc.ExecuteFunc("CodejyRun", files[i2], false)
				}
			} else {

				globalfunc.ExecuteFunc("CodejyRun", path, false)
			}
		}
	}
}

// 获取命令名称
func (m *LoadFileCmd) GetName() string {
	return "load"
}

// 获取命令描述
func (m *LoadFileCmd) GetDesc() string {
	return "在启动前预先装载文件 比如: -load file,file,dir,file"
}

// 优先级  ,0最低...
func (m *LoadFileCmd) GetPriority() int {
	return m.priority
}

// 是否终止
func (m *LoadFileCmd) IsExit() bool {
	return false
}

// 定义一个类型，用于增加该类型方法
type sliceValue []string

// new一个存放命令行参数值的slice
func newSliceValue(vals []string, p *[]string) *sliceValue {
	*p = vals
	return (*sliceValue)(p)
}

func (s *sliceValue) Set(val string) error {
	*s = sliceValue(strings.Split(val, ","))
	return nil
}

// flag为slice的默认值default is me,和return返回值没有关系
func (s *sliceValue) String() string {
	//*s = sliceValue(strings.Split("default is me", ",")) //这里可以设置默认值
	return ""
}

// 是否是文件
func IsDir(path string) bool {
	file, err := os.OpenFile(path, os.O_RDONLY, 0755)
	defer file.Close()
	fileInfo, err := file.Stat()
	if err != nil {
		return false
	}
	return fileInfo.IsDir()
}
